package control;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import config.DBConnectionConfig;
import model.Book;
import util.Parser;
import util.Protocol;

/**
 * 操作员类，负责处理图书管理系统的所有数据库操作
 * 包括图书的增删改查等核心业务逻辑
 */
public class Operator {

	/**
	 * 处理客户端发送的操作请求
	 * @param receiveStr 客户端发送的原始字符串指令
	 * @return 处理结果字符串，可能是成功/失败标志或查询结果
	 */
	public String doOper(String receiveStr) {
		// 解析客户端发送的指令字符串
		Parser parser = new Parser();
		String[] parsedStr = parser.MyParser(receiveStr);
		String oper = parsedStr[0]; // 获取操作类型
		boolean isSuccess = false;  // 操作结果标志

		// 根据不同的操作类型执行相应的业务逻辑
		switch (oper) {
			case "addbook": { // 增加图书操作
				isSuccess = addbook(parsedStr[1], parsedStr[2], Float.parseFloat(parsedStr[3]));
				return String.valueOf(isSuccess);
			}
			case "delbybookname": { // 根据书名删除图书
				isSuccess = delbybookname(parsedStr[1]);
				return String.valueOf(isSuccess);
			}
			case "delbyauthor": { // 根据作者删除图书
				isSuccess = delbyauthor(parsedStr[1]);
				return String.valueOf(isSuccess);
			}
			case "fndbybookname": { // 根据书名查询图书
				ArrayList<Book> booklist = fndbybookname(parsedStr[1]);
				Protocol protocol = new Protocol();
				String returnStr = protocol.getFndMsg(booklist);
				System.out.println("returnStr: " + returnStr);
				return returnStr;
			}
			case "fndbyauthor": { // 根据作者查询图书
				ArrayList<Book> booklist = fndbyauthor(parsedStr[1]);
				Protocol protocol = new Protocol();
				String returnStr = protocol.getFndMsg(booklist);
				return returnStr;
			}
			case "fndbyprice": { // 根据价格范围查询图书
				ArrayList<Book> booklist = fndbyprice(Float.parseFloat(parsedStr[1]), Float.parseFloat(parsedStr[2]));
				Protocol protocol = new Protocol();
				String returnStr = protocol.getFndMsg(booklist);
				return returnStr;
			}
			case "altbook": { // 修改图书信息
				isSuccess = altbook(parsedStr[1], parsedStr[2], parsedStr[3], Float.parseFloat(parsedStr[4]));
				return String.valueOf(isSuccess);
			}
			case "prtallbook": { // 打印所有图书
				ArrayList<Book> booklist = BookList();
				Protocol protocol = new Protocol();
				String returnStr = protocol.getFndMsg(booklist);
				return returnStr;
			}
			default:
				return "false"; // 未知操作返回false
		}
	}

	/**
	 * 获取所有图书列表
	 * @return 包含所有图书的ArrayList集合
	 */
	public ArrayList<Book> BookList() {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 查询所有图书记录
			String sql = "select * from booklist;";
			ResultSet rs = sta.executeQuery(sql);
			ArrayList<Book> booklist = new ArrayList<Book>();

			// 遍历结果集，封装成Book对象
			while (rs.next()) {
				String bookname = rs.getString("bookname");
				String author = rs.getString("author");
				float price = rs.getFloat("price");
				Book book = new Book(bookname, author, price);
				booklist.add(book);
			}
			return booklist;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return null;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 添加新图书
	 * @param bookname 图书名称
	 * @param author 作者
	 * @param price 价格
	 * @return 添加是否成功
	 */
	public boolean addbook(String bookname, String author, float price) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 插入新图书记录
            // 显式指定字段列表（请根据你的表结构修改字段名）
            String sql = "INSERT INTO booklist (bookname, author, price) VALUES ('" + bookname + "', '" + author + "', " + price + ")";
			int rs = sta.executeUpdate(sql);
			// 判断插入是否成功
			if (rs != 0) {
				return true;
			} else
				return false;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return false;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据书名删除图书
	 * @param bookname 要删除的图书名称
	 * @return 删除是否成功
	 */
	public boolean delbybookname(String bookname) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 删除指定书名的图书记录
			String sql = "delete from booklist where bookname = " + "'" + bookname + "';";
			System.out.println(sql);
			int rs = sta.executeUpdate(sql);
			// 判断删除是否成功
			if (rs != 0) {
				return true;
			} else
				return false;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return false;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据作者删除图书
	 * @param author 要删除的图书作者
	 * @return 删除是否成功
	 */
	public boolean delbyauthor(String author) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 删除指定作者的图书记录
			String sql = "delete from booklist where author = " + "'" + author + "';";
			int rs = sta.executeUpdate(sql);
			// 判断删除是否成功
			if (rs != 0) {
				return true;
			} else
				return false;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return false;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据书名查询图书
	 * @param bknm 要查询的图书名称
	 * @return 符合条件的图书列表
	 */
	public ArrayList<Book> fndbybookname(String bknm) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 查询指定书名的图书记录
			String sql = "select * from booklist where(bookname ='" + bknm + "');";
			ResultSet rs = sta.executeQuery(sql);
			ArrayList<Book> booklist = new ArrayList<Book>();

			// 遍历结果集，封装成Book对象
			while (rs.next()) {
				String bookname = rs.getString("bookname");
				String author = rs.getString("author");
				float price = rs.getFloat("price");
				Book book = new Book(bookname, author, price);
				booklist.add(book);
			}
			return booklist;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return null;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据作者查询图书
	 * @param autr 要查询的作者名称
	 * @return 符合条件的图书列表
	 */
	public ArrayList<Book> fndbyauthor(String autr) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 查询指定作者的图书记录
			String sql = "select * from booklist where(author ='" + autr + "')";
			ResultSet rs = sta.executeQuery(sql);
			ArrayList<Book> booklist = new ArrayList<Book>();

			// 遍历结果集，封装成Book对象
			while (rs.next()) {
				String bookname = rs.getString("bookname");
				String author = rs.getString("author");
				float price = rs.getFloat("price");
				Book book = new Book(bookname, author, price);
				booklist.add(book);
			}
			return booklist;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return null;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据价格范围查询图书
	 * @param lowbound 价格下限
	 * @param upbound 价格上限
	 * @return 符合价格范围的图书列表
	 */
	public ArrayList<Book> fndbyprice(float lowbound, float upbound) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 查询指定价格范围的图书记录
			String sql = "select * from booklist where(price between " + lowbound + " and " + upbound + ");";
			ResultSet rs = sta.executeQuery(sql);
			ArrayList<Book> booklist = new ArrayList<Book>();

			// 遍历结果集，封装成Book对象
			while (rs.next()) {
				String bookname = rs.getString("bookname");
				String author = rs.getString("author");
				float price = rs.getFloat("price");
				Book book = new Book(bookname, author, price);
				booklist.add(book);
			}
			return booklist;
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return null;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}

	/**
	 * 修改图书信息
	 * @param cursorbookname 原图书名称（用于定位要修改的记录）
	 * @param bookname 新图书名称
	 * @param author 新作者
	 * @param price 新价格
	 * @return 修改是否成功
	 */
	public boolean altbook(String cursorbookname, String bookname, String author, float price) {
		Connection conn = null;
		Statement sta = null;
		try {
			// 获取数据库连接
			conn = DBConnectionConfig.getConnection();
			sta = conn.createStatement();
			// 更新图书信息
			String sql = "update booklist set bookname='" + bookname + "',author='" + author + "',price=" + price
					+ " where(bookname='" + cursorbookname + "');";
			int rs = sta.executeUpdate(sql);
			// 判断更新是否成功
			if (rs != 0) {
				return true;
			} else {
				return false;
			}
		} catch (SQLException e) {
			// 打印异常堆栈信息
			e.printStackTrace();
			return false;
		} finally {
			// 关闭数据库资源
			try {
				if (sta != null) {
					sta.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// 打印异常堆栈信息
				e.printStackTrace();
			}
		}
	}
}
